/**
 * 计算倒计时剩余时间
 * @param createTime 订单创建时间（ISO 8601格式的字符串）
 * @param expireMinutes 过期分钟数
 * @returns 返回包含剩余时间的对象，如果已过期则返回null
 */
export function calculateTimeLeft(createTime: string, expireMinutes: number = 30): { minutes: number; seconds: number } | null {
  if (!createTime) return null;

  const createdAt = new Date(createTime).getTime();
  const expiresAt = createdAt + expireMinutes * 60 * 1000; // 转换为毫秒
  const now = Date.now();

  // 计算剩余时间（毫秒）
  const timeLeft = expiresAt - now;

  // 如果已经过期，返回null
  if (timeLeft <= 0) return null;

  // 转换为分钟和秒
  const minutes = Math.floor(timeLeft / (1000 * 60));
  const seconds = Math.floor((timeLeft % (1000 * 60)) / 1000);

  return { minutes, seconds };
}

/**
 * 格式化倒计时显示
 * @param timeLeft 剩余时间对象
 * @returns 格式化的时间字符串 (MM:SS)
 */
export function formatTimeLeft(timeLeft: { minutes: number; seconds: number } | null): string {
  if (!timeLeft) return "00:00";

  const { minutes, seconds } = timeLeft;
  return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
}

/**
 * 创建倒计时更新器
 * @param createTime 订单创建时间
 * @param expireMinutes 过期分钟数
 * @param updateCallback 更新回调函数，接收格式化的时间字符串
 * @param expireCallback 过期回调函数
 * @returns 定时器ID，可用于清除定时器
 */
export function createCountdown(
  createTime: string,
  expireMinutes: number = 30,
  updateCallback: (timeString: string) => void,
  expireCallback?: () => void
): number {
  // 初始更新一次
  let timeLeft = calculateTimeLeft(createTime, expireMinutes);
  updateCallback(formatTimeLeft(timeLeft));

  // 如果已经过期，立即执行过期回调
  if (!timeLeft && expireCallback) {
    expireCallback();
    return 0;
  }

  // 每秒更新一次
  const timerId = setInterval(() => {
    timeLeft = calculateTimeLeft(createTime, expireMinutes);

    if (timeLeft) {
      updateCallback(formatTimeLeft(timeLeft));
    } else {
      // 倒计时结束，清除定时器并执行过期回调
      clearInterval(timerId);
      if (expireCallback) {
        expireCallback();
      }
    }
  }, 1000);

  return timerId;
}

/**
 * 清除倒计时
 * @param timerId 定时器ID
 */
export function clearCountdown(timerId: number): void {
  if (timerId) {
    clearInterval(timerId);
  }
} 